package groupd

import (
	"time"

	"gogs.xiaoyuanjijiehao.com/antlinker/antcms/core/infod"
)

// GroupKind 信息组类型
type GroupKind int

const (
	// GroupKindAll 所有 用于查询
	GroupKindAll GroupKind = iota - 1
	// GroupKindManual 手动
	GroupKindManual
	// GroupKindAuto 自动
	GroupKindAuto
)

// GroupDesc Group描述实例
type GroupDesc struct {
	Owner     string    `json:"owner"`      // - 所属用户
	Org       string    `json:"org"`        //- 所属组织
	Kind      GroupKind `json:"kind"`       // 类型（0,手动，1自动）
	Name      string    `json:"name"`       // 组名称
	ShortName string    `json:"short_name"` // 简称
	Icon      []string  `json:"icon"`       // 图标
	Desc      string    `json:"desc"`       // 简介
}

// GroupCtlParam 信息组控制参数
type GroupCtlParam struct {
	Flags      []string `json:"flags"`       // 用户自行定义组标识
	Rules      []Rule   `json:"rules"`       // 组规则
	InfoWeight int      `json:"info_weight"` // 权重模式 0.保持收录信息的权重 ，1.默认信息的权重0，
}

// GStatus 组状态
type GStatus int

const (
	// GSAll 全部状态查询使用
	GSAll GStatus = iota - 2
	// GSDeleted 已删除
	GSDeleted
	// GSStop 停止 不在自动或手动收录信息进入组
	GSStop
	// GSNormal 正常状态
	GSNormal
)

// GroupStatus 组状态
type GroupStatus struct {
	Status  GStatus `json:"status"`   //状态 0 停止 -1 删除 1 收集
	InfoNum int     `json:"info_num"` // 组内信息数量
}

// Rule 组规则定义
type Rule struct {
	ColumnID string   `json:"column_id,omitempty"` // 栏目
	Org      string   `json:"org,omitempty"`       // 组织
	Own      string   `json:"own,omitempty"`       // 所有者
	Key      string   `json:"key,omitempty"`       // 关键字		针对信息内的文本内容做全文检索
	Tags     []string `json:"tags,omitempty"`      // 标签		完全匹配所有标签
}

// GroupSearch 查询条件
type GroupSearch struct {
	// Owner Org 如果都为空 :
	// 	 Range 0 查询所有信息包含 所有者和所属组织的信息
	// 	Range  1 查询除所属组织所属用户以外的信息
	// Owner Org 任何一个不为空：
	// 	  Range 参数失效
	Range  int       `json:"range,omitempty"`  // 匹配范围
	Owner  string    `json:"owner,omitempty"`  // 匹配所有者
	Org    string    `json:"org,omitempty"`    // 匹配所属组织
	Kind   GroupKind `json:"Kind,omitempty"`   // 匹配信息组类型 类型（0,手动，1自动 -1 所有）
	Key    string    `json:"key,omitempty"`    // 匹配信息组名称
	Status []GStatus `json:"status,omitempty"` // 状态 0 正常 -1 删除 1,刷新
	Flags  []string  `json:"flags,omitempty"`  // 匹配组标志 ，指定多个flags需要完全匹配才能命中组
}

// GroupInfoEntity 组信息描述实例
type GroupInfoEntity struct {
	GIID          string `json:"giid,omitempty"` // 编码
	GroupInfoDesc `json:"desc,omitempty"`
}

// GroupInfoDesc 组内信息描述
type GroupInfoDesc struct {
	GroupID string `json:"group_id"` // 信息组编码
	InfoID  string `json:"info_id"`  // 信息编码
	Weight  int    `json:"weight"`   // 权重
	//	WeightDeadline time.Time `json:"weight_dateline"` // 权重截止时间 ，到了截止时间后需要自动将权重变成0
	Seq         string    `json:"Seq"`         // 排序唯一
	CreTime     time.Time `json:"cre_time"`    // 加入时间
	Title       string    `json:"title"`       // 标题
	ColumnID    string    `json:"column_id"`   // 栏目编号
	ColumnName  string    `json:"column_name"` // 栏目名称
	PublishTime time.Time `json:"pub_time"`    // 发布时间
}

// InfoColl 用来和组规则匹配的信息
type InfoColl struct {
	Info     *infod.InfoAggregate // 信息聚合
	Tags     map[string]bool      // 信息标签重新处理成map
	Owner    string               // 信息所有者
	Org      string               // 信息所属组织
	ColumnID string               // 信息所在栏目
	Content  string               // 信息匹配关键字的内容
}

// NewInfoColl InfoColl 创建一个InfoColl
func NewInfoColl(i *infod.InfoAggregate) *InfoColl {
	ic := &InfoColl{
		Info:     i,
		Tags:     make(map[string]bool),
		Owner:    i.Owner,
		Org:      i.Org,
		ColumnID: i.ColumnID,
		Content:  i.Title + i.SubTitle + i.Desc + i.Content,
	}
	if len(i.Tags) > 0 {
		for _, t := range i.Tags {
			ic.Tags[t] = true
		}
	}

	return ic
}
